package org.example.review.controller;

import com.common.result.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.example.review.dto.ChangePasswordRequest;
import org.example.review.dto.LoginRequest;
import org.example.review.dto.LoginResponse;
import org.example.review.dto.UserDTO;
import org.example.review.service.UserService;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 */
@Slf4j
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
    
    private final UserService userService;
    
    /**
     * 用户登录
     * @param loginRequest 登录请求信息
     * @return 统一响应结果，包含token和用户信息
     */
    @PostMapping("/login")
    public Result<LoginResponse> login(@RequestBody LoginRequest loginRequest) {
        try {
            log.info("收到登录请求，用户名: {}", loginRequest.getUsername());
            LoginResponse loginResponse = userService.login(loginRequest);
            return Result.success(loginResponse);
        } catch (IllegalArgumentException e) {
            log.warn("登录失败: {}", e.getMessage());
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("登录异常", e);
            return Result.error("登录失败，请稍后再试");
        }
    }
    
    /**
     * 获取用户信息
     * @param userId 用户ID
     * @return 统一响应结果，包含用户信息
     */
    @GetMapping("/info/{userId}")
    public Result<UserDTO> getUserInfo(@PathVariable Integer userId) {
        try {
            UserDTO user = userService.getUserById(userId);
            return Result.success(user);
        } catch (IllegalArgumentException e) {
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("获取用户信息异常", e);
            return Result.error("获取用户信息失败");
        }
    }
    
    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 统一响应结果，包含用户信息
     */
    @GetMapping("/info")
    public Result<UserDTO> getUserInfoByUsername(@RequestParam String username) {
        try {
            UserDTO user = userService.getUserByUsername(username);
            return Result.success(user);
        } catch (IllegalArgumentException e) {
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("获取用户信息异常", e);
            return Result.error("获取用户信息失败");
        }
    }
    
    /**
     * 修改密码
     * @param request 修改密码请求
     * @return 统一响应结果
     */
    @PostMapping("/change-password")
    public Result<String> changePassword(@RequestBody ChangePasswordRequest request) {
        try {
            log.info("收到密码修改请求，用户ID: {}, 用户名: {}", request.getUserId(), request.getUsername());
            boolean success = userService.changePassword(request);
            if (success) {
                return Result.success("密码修改成功");
            } else {
                return Result.error("密码修改失败");
            }
        } catch (IllegalArgumentException e) {
            log.warn("密码修改失败: {}", e.getMessage());
            return Result.error(e.getMessage());
        } catch (Exception e) {
            log.error("密码修改异常", e);
            return Result.error("密码修改失败，请稍后再试");
        }
    }
    
    /**
     * 用户登出
     * @return 统一响应结果
     */
    @PostMapping("/logout")
    public Result<String> logout() {
        // 简单实现，实际项目中应该清除session或token
        log.info("用户登出");
        return Result.success("登出成功");
    }
}
